#ifndef _NOEUD_
#define _NOEUD_

#include <iostream>

#include "structure.hpp"
#include "arc.hpp"

using namespace std;

/* -- Définition de la structure Noeud --
 *
struct Noeud {
    char * nom;

    Arc **arc_inc_ext;
    int nb_arc_ext;
    int capa_arc_ext;

    Arc **arc_inc_int;
    int nb_arc_int;
    int capa_arc_int;
*/

/*
    Pour toutes les fonctions si dessous, la variable verbose permet d'afficher des information
    supplémentaires lors de l'éxecution, principalement utiles au débuggage
*/

Noeud* initNoeud (char * nom, bool verbose = false);
/*  Initialise un noeud
    Préconditions :
        * char contient le nom du noeud (peut être égal à NULL)
    Postconditions :
        * renvoie un noeud initialisé avec pour nom la chaine passée en paramètre
*/

void ajouteArcExt (Noeud *n, Arc *a, bool verbose = false);
/*  Ajoute au noeud un arc incident exterieur
    Préconditions :
        * n initialisé
        * a initalisé
    Postconditions :
        * n a un nouvel arc incident exterieur a
        * si le tableau d'arcs incidents extérieurs doit être agrandis, la fonction s'en occupe
*/

void ajouteArcInt (Noeud *n, Arc *a, bool verbose = false);
/*  Ajoute au noeud un arc incident interieur
    Préconditions :
        * n initialisé
        * a initalisé
    Postconditions :
        * n a un nouvel arc incident interieur a
        * si le tableau d'arcs incidents interieurs doit être agrandis, la fonction s'en occupe
*/

int decrocherArcExt(Noeud *n, Arc *a, bool verbose = false);
/*  enleve l'arc incident exterieur a du noeud n sans supprimer l'arc a
    Préconditions :
        * n initialisé
        * a initalisé
    Postconditions :
        * n n'a plus comme arc incident exterieur a
        * si le tableau d'arcs incidents extérieurs doit être réduit, la fonction s'en occupe
        * a existe encore
*/

int decrocherArcInt(Noeud *n, Arc *a, bool verbose = false);
/*  enleve l'arc incident interieur a du noeud n sans supprimer l'arc a
    Préconditions :
        * n initialisé
        * a initalisé
    Postconditions :
        * n n'a plus comme arc incident interieur a
        * si le tableau d'arcs incidents extérieurs doit être réduit, la fonction s'en occupe
        * a existe encore
*/

void affichageNoeud (const Noeud *n);
/*  Affiche un noeud
    Préconditions :
        * n initialisé
*/

void testamentNoeud (Noeud *n);
/*  supprime un noeud
    ATTENTION : ne pas utiliser, cette fonction doit être utilisée par les autres fonctions du programme
    Préconditions :
        * n initialisé
    Postconditions :
        * les tableaux d'arcs incidents interieurs et exterieurs sont libérés
        * Les arcs dans ces tableaux ne sont pas supprimés
        * n est libéré
*/

#endif // _NOEUD_
